// 对Date的扩展，将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子：
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
function format_date(date, fmt) { //author: meizz
    var o = {
        "M+": date.getMonth() + 1,                 //月份
        "d+": date.getDate(),                    //日
        "h+": date.getHours(),                   //小时
        "m+": date.getMinutes(),                 //分
        "s+": date.getSeconds(),                 //秒
        "q+": Math.floor((date.getMonth() + 3) / 3), //季度
        "S" : date.getMilliseconds()             //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}
function normalizeDate(d) {
    var date;
    var type = typeof d;
    if (type == 'undefined') {
        date = new Date();
    }
    else if (d instanceof Date) {
        date = d;
    }
    else if (type == 'string' || type == 'number') {
        date = new Date(Number(d));
    } else {
        date = new Date();
    }

    return date;
}

module.exports = {
    lastSecOf         : function (date) {
        date = normalizeDate(date);
        date.setHours(23, 59, 59);
        return date.getTime();
    },
    firstSecOf        : function (date) {
        date = normalizeDate(date);
        date.setHours(0, 0, 0, 0);
        return date.getTime();
    }
    ,
    firstSecOfTheMonth: function (date) {
        date = normalizeDate(date);
        date.setDate(1);
        date.setHours(0, 0, 0, 0);
        return date.getTime();
    },
    lastSecOfTheMonth : function (date) {
        date = normalizeDate(date);
        date.setMonth(date.getMonth() + 1);
        date.setDate(1);
        date.setHours(0, 0, 0, 0);
        return date.getTime() - 1;
    },
    format            : function (date, fmt) {
        return format_date(
            normalizeDate(date),
            fmt || 'yyyy-MM-dd')
    }
};